/*------------------------------------------------------------------------------
 * @file    TIM_SCHEDULER.H
 * @author  嵌入式王子
 * @email   donminedm@163.com
 * @date    2024/07/31 21:43:56
 * @brief   开源的嵌入式软件包，本人不对此代码负责任
 * -----------------------------------------------------------------------------*/
#ifndef _TIM_SCHEDULER_
#define _TIM_SCHEDULER_

#include <stdint.h>

/**
 * @brief 任务状态列表定义
 */
typedef enum TASK_STATE
{
    TASK_NOT_RUN = 0, // 任务未运行，默认:状态
    TASK_READY,       // 任务就绪，任务可以被运行
    TASK_RUN,         // 任务运行中
    TASK_SUSPEND      // 任务挂起，不参与调度
} task_state;

/**
 * @brief 任务定义结构体
 */
typedef struct TASK_BLOCK_T
{
    /**
     * @brief 任务的运行函数
     *
     * @return 函数指针
     */
    void (*task_fnc)(void); // void task_blk(void){}  无参数,无返回值
    /**
     * @brief 任务间隔
     *
     */
    uint32_t intel;
    /**
     * @brief 任务tick，每次心跳进行一次累计，tick == intel ， Task -> TASK_READY
     *
     */
    __IO uint32_t tick;
    /**
     * @brief 任务计数器
     *         0 ~ intel
     */
    uint32_t use_time;
    /**
     * @brief 任务运行标志 @task_state
     */
    __IO task_state state; // 默认：0

} task_blk;

#define TASK_DEFAULT_INIT 0, 0, TASK_NOT_RUN

/**
 * @brief 任务列表定义
 *
 */
typedef enum TASK_LIST
{
    TASK_IWDG = 0,   // 看门狗任务
    TASK_SMG_UPDATE, // 数码管刷新
    TASK_LED_SYS,    // 系统指示灯
    TASK_E2PROM,     // 参数保存任务
    TASK_REMOTE,     // 红外按键任务
    TASK_COM,        // 通讯任务
    // TASK_LED,         // lED模块
    // 任务添加在此之前 ↑
    TASK_MAX
} task_list;

/**
 * @brief 任务的使能
 *
 * @param task_no  任务序号
 * @param enable 1使能；0失能
 */
void task_enable(task_list task_no, uint8_t enable);

// 启动任务
#define ENABLE_TASK(task_blk) task_enable(task_blk, 1)

// 关闭任务
#define DISABLE_TASK(task_blk) task_enable(task_blk, 0)

/**
 * @brief 任务调度器
 *
 */
void task_scheduler();

/**
 * @brief  任务初始化
 *
 */
void task_init(task_blk _task[]);

/**
 * @brief 定时器中断调用，中断单位：1ms：后台
 *
 */
void task_tick();

void task_printf();

#define TASK_GET_TICK HAL_GetTick

#endif // !TIM_SCHEDULER
